package ar.uba.fi.taller2.cmmiassistant.frontend.evaluacion;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreePath;

import ar.uba.fi.taller2.cmmiassistant.controlador.Controlador;
import ar.uba.fi.taller2.cmmiassistant.controlador.Transicion;
import ar.uba.fi.taller2.cmmiassistant.frontend.PanelVista;
import ar.uba.fi.taller2.cmmiassistant.frontend.adaptadores.arbol.NodoArbol;
import ar.uba.fi.taller2.cmmiassistant.frontend.evaluacion.editorescalificacion.EditorCalificacionAreasDeProceso;
import ar.uba.fi.taller2.cmmiassistant.frontend.evaluacion.editorescalificacion.EditorCalificacionObjetivos;
import ar.uba.fi.taller2.cmmiassistant.frontend.evaluacion.editorescalificacion.EditorCalificacionPracticas;
import ar.uba.fi.taller2.cmmiassistant.frontend.renderers.CmmiAssistantTreeCellRenderer;
import ar.uba.fi.taller2.cmmiassistant.vista.Accion;
import ar.uba.fi.taller2.cmmiassistant.vista.Estado;
import ar.uba.fi.taller2.cmmiassistant.vista.Vista;

public class EditorEvaluaciones extends PanelVista {

	private static final long serialVersionUID = 7377212242521994937L;

	private JSplitPane splitPane = null;
	private JTree treeNavegacion = null;
	private ArbolEditorEvaluacion arbolEditorEvaluacion = null; // @jve:decl-index=0:
	private JScrollPane scrollPane = null;

	/**
	 * Panel central
	 */
	private JPanel panel = null;
	private CardLayout layoutPanel = null; // @jve:decl-index=0:

	/**
	 * Subpaneles del Panel central
	 */
	private JPanel panelVacio = null;
	private Map<Estado, EditorCalificacion> editoresCalificacion = null;

	private void inicializarEditoresCalificacion() {
		// EditorCalificacion editorCalificacionOrganizacion = new
		// EditorCalificacion(
		// this, new OrganizacionConversorEvaluables()) {
		// private static final long serialVersionUID = 5916559849018423142L;
		//
		// @Override
		// public Estado getEstado() {
		// return Estado.EDITANDO_EVALUACION_ORGANIZACION;
		// }
		// };
		//
		// EditorCalificacion editorCalificacionInstancia = new
		// EditorCalificacion(
		// this, new InstanciaConversorEvaluables()) {
		// private static final long serialVersionUID = 391119006879121565L;
		//
		// @Override
		// public Estado getEstado() {
		// return Estado.EDITANDO_EVALUACION_INSTANCIA;
		// }
		// };
		//
		// EditorCalificacion editorCalificacionEvaluacion = new
		// EditorCalificacion(
		// this, new EvaluacionConversorEvaluables()) {
		// private static final long serialVersionUID = -404322047397291204L;
		//
		// @Override
		// public Estado getEstado() {
		// return Estado.EDITANDO_EVALUACION_EVALUACION;
		// }
		// };
		//
		// editoresCalificacion.put(editorCalificacionOrganizacion.getEstado(),
		// editorCalificacionOrganizacion);
		// editoresCalificacion.put(editorCalificacionInstancia.getEstado(),
		// editorCalificacionInstancia);
		// editoresCalificacion.put(editorCalificacionEvaluacion.getEstado(),
		// editorCalificacionEvaluacion);
		EditorCalificacion editorCalificacionPracticas = new EditorCalificacionPracticas(
				getContexto());
		EditorCalificacion editorCalificacionObjetivos = new EditorCalificacionObjetivos(
				getContexto());
		EditorCalificacion editorCalificacionAreasDeProceso = new EditorCalificacionAreasDeProceso(
				getContexto());
		editoresCalificacion.put(editorCalificacionPracticas.getEstado(),
				editorCalificacionPracticas);
		editoresCalificacion.put(editorCalificacionObjetivos.getEstado(),
				editorCalificacionObjetivos);
		editoresCalificacion.put(editorCalificacionAreasDeProceso.getEstado(),
				editorCalificacionAreasDeProceso);
		for (EditorCalificacion editorCalificacion : editoresCalificacion
				.values()) {
			configurarAlActivar(editorCalificacion);
		}
	}

	/**
	 * Manejador de eventos de seleccion sobre el arbol.
	 */
	private TreeSelectionListener observadorSeleccion = new TreeSelectionListener() {

		public void valueChanged(TreeSelectionEvent evento) {
			/* guardo en un array los elementos del path, para luego recorrerlo de atras para adelante
			 * y ejecutar todas las transiciones*/
			ArrayList<TreePath> treePaths = new ArrayList<TreePath>();
			TreePath treePath = evento.getPath();			
			while (treePath != null) {
				treePaths.add(treePath);
				treePath = treePath.getParentPath();
			}
			for (int x = treePaths.size()-1; x>=0 ; x--){
				treePath = treePaths.get(x);
				if (treePath.getLastPathComponent()!=null){
					/* obtiene el nodo seleccionado */
					NodoArbol nodoPadre = (NodoArbol)treePath.getLastPathComponent();
					Transicion transicionPadre = nodoPadre.getAlSeleccionar();
					/* si el nodo tiene una transicion asociada la ejecuta */
					if (transicionPadre!=null)
						EditorEvaluaciones.this.getControlador().ejecutar(transicionPadre);
				}
			}
		}
	};

    private TreeCellRenderer cellRenderer;

	/**
	 * This method initializes
	 * 
	 */
	public EditorEvaluaciones(Vista contexto) {
		super(contexto);
		editoresCalificacion = new HashMap<Estado, EditorCalificacion>(3);
		initialize();
	}

	public Estado getEstado() {

		return Estado.ADMINISTRANDO_EVALUACIONES;
	}

	/**
	 * This method initializes this
	 * 
	 */
	private void initialize() {
		inicializarEditoresCalificacion();
		this.setLayout(new BorderLayout());
		this.setSize(new Dimension(425, 290));
		this.add(getSplitPane(), BorderLayout.CENTER);

	}

	/**
	 * This method initializes splitPane
	 * 
	 * @return javax.swing.JSplitPane
	 */
	private JSplitPane getSplitPane() {
		if (splitPane == null) {
			splitPane = new JSplitPane();
			splitPane.setLeftComponent(getScrollPane());
			JScrollPane scroll = new JScrollPane();
			scroll.setViewportView(getPanel());
			splitPane.setRightComponent(scroll);
		}
		return splitPane;
	}

	/**
	 * This method initializes treeNavegacion
	 * 
	 * @return javax.swing.JTree
	 */
	private JTree getTreeNavegacion() {
		if (treeNavegacion == null) {
			treeNavegacion = new JTree();
			treeNavegacion.addTreeSelectionListener(this.observadorSeleccion);
			treeNavegacion.setModel(this.getArbolEditorEvaluacion());
			treeNavegacion.setCellRenderer(this.getCellRenderer());
		}
		return treeNavegacion;
	}

	private TreeCellRenderer getCellRenderer() {

	    if (this.cellRenderer == null) {
	        
	        this.cellRenderer = new CmmiAssistantTreeCellRenderer();
	    }
        return this.cellRenderer;
    }

    /**
	 * This method initializes panel
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getPanel() {
		if (panel == null) {
			panel = new JPanel();
			panel.setLayout(this.getLayoutPanel());
			/* panel vacio */
			panel.add(this.getPanelVacio(), "");

			for (Entry<Estado, EditorCalificacion> entrada : editoresCalificacion
					.entrySet()) {
				panel.add(entrada.getValue(), entrada.getKey().getName());
			}

			// this.getMostrandoEvidencias().getButtonModificar()
			// .addActionListener(new ActionListener() {
			//
			// public void actionPerformed(ActionEvent e) {
			//
			// Evidencia evidencia = getMostrandoEvidencias()
			// .getModeloTablaEvidencias().getEvidencia(
			// getMostrandoEvidencias()
			// .getTableEvidencias()
			// .getSelectedRow());
			//
			// if (evidencia != null) {

			//
			// getControlador().ejecutar(
			// new Transicion(
			// getMostrandoEvidencias(),
			// getEditandoEvidencia(),
			// getControlador()
			// .seleccionarEvidencia(
			// evidencia)));
			// }
			// }
			// });

		}
		return panel;
	}

	public void setControlador(Controlador controlador) {

		super.setControlador(controlador);
		this.getArbolEditorEvaluacion().setControlador(controlador);
		for (EditorCalificacion editorCalificacion : editoresCalificacion
				.values()) {
			editorCalificacion.setControlador(controlador);
		}
	}

	private ArbolEditorEvaluacion getArbolEditorEvaluacion() {

		if (this.arbolEditorEvaluacion == null) {

			this.arbolEditorEvaluacion = new ArbolEditorEvaluacion();
			this.arbolEditorEvaluacion.setVista(this);
		}
		return arbolEditorEvaluacion;
	}

	/**
	 * This method initializes scrollPane
	 * 
	 * @return javax.swing.JScrollPane
	 */
	private JScrollPane getScrollPane() {
		if (scrollPane == null) {
			scrollPane = new JScrollPane();
			scrollPane.setMinimumSize(new Dimension(200, 200));
			scrollPane.setViewportView(getTreeNavegacion());
		}
		return scrollPane;
	}

	private CardLayout getLayoutPanel() {

		if (this.layoutPanel == null) {

			this.layoutPanel = new CardLayout();
		}

		return this.layoutPanel;
	}

	// private MostrandoEvidencias getMostrandoEvidencias() {
	//
	// if (this.mostrandoEvidencias == null) {
	//
	// this.mostrandoEvidencias = new MostrandoEvidencias(this);
	// this.setAlActivar(this.mostrandoEvidencias);
	// }
	//
	// return this.mostrandoEvidencias;
	// }

	private void configurarAlActivar(final EditorCalificacion editorCalificacion) {

		editorCalificacion.setAlActivar(new Accion() {

			public void ejecutar(Vista vista) {
				EditorEvaluaciones.this.getLayoutPanel().show(getPanel(),
						editorCalificacion.getEstado().getName());

			}
		});
	}

	private JPanel getPanelVacio() {

		if (this.panelVacio == null) {

			this.panelVacio = new JPanel();
		}
		return this.panelVacio;
	}

}
